package org.yelongframework.pdf;

import java.util.List;
import java.util.function.BiPredicate;
import java.util.function.Function;

/**
 * PDF绘图位置
 * 
 * @since 1.0.0
 */
public final class PDFDrawImagePosition {

	/** 宽度获取，入参为图片源宽度，出参为插入的宽度 */
	private Function<Float, Float> width;

	/** 高度获取，入参为图片源高度，出参为插入的高度 */
	private Function<Float, Float> height;

	/** 插入的X轴位置 */
	private int posX;

	/** 插入的Y轴位置 */
	private int posY;

	/** 插入的页码，入参1为PDF当前操作的页数，入参2为PDF总页数 */
	private BiPredicate<Integer, Integer> page;

	// ==================================================constructor==================================================

	public PDFDrawImagePosition() {
		super();
	}

	/**
	 * @param width  宽度
	 * @param height 高度
	 * @param posX   X轴
	 * @param posY   Y轴
	 * @param page   页码
	 */
	public PDFDrawImagePosition(Float width, Float height, int posX, int posY, List<Integer> page) {
		this(x -> width, x -> height, posX, posY, (x, y) -> page.contains(x));
	}

	/**
	 * @param width  宽度
	 * @param height 高度
	 * @param posX   X轴
	 * @param posY   Y轴
	 * @param page   页码
	 */
	public PDFDrawImagePosition(Float width, Float height, int posX, int posY, BiPredicate<Integer, Integer> page) {
		this(x -> width, x -> height, posX, posY, page);
	}

	/**
	 * @param width  宽度获取，入参为图片源宽度，出参为插入的宽度
	 * @param height 高度获取，入参为图片源高度，出参为插入的高度
	 * @param posX   X轴
	 * @param posY   Y轴
	 * @param page   插入的页码，入参1为PDF当前操作的页数，入参2为PDF总页数
	 */
	public PDFDrawImagePosition(Function<Float, Float> width, Function<Float, Float> height, int posX, int posY,
			BiPredicate<Integer, Integer> page) {
		this.width = width;
		this.height = height;
		this.posX = posX;
		this.posY = posY;
		this.page = page;
	}

	// ==================================================get/set==================================================

	/**
	 * @return 宽度
	 */
	public Function<Float, Float> getWidth() {
		return width;
	}

	/**
	 * @param width 宽度
	 */
	public void setWidth(Function<Float, Float> width) {
		this.width = width;
	}

	/**
	 * @param width 宽度
	 */
	public void setWidth(Float width) {
		this.width = x -> width;
	}

	/**
	 * @return 高度
	 */
	public Function<Float, Float> getHeight() {
		return height;
	}

	/**
	 * @param height 高度
	 */
	public void setHeight(Function<Float, Float> height) {
		this.height = height;
	}

	/**
	 * @param height 高度
	 */
	public void setHeight(Float height) {
		this.height = x -> height;
	}

	/**
	 * @return X轴
	 */
	public int getPosX() {
		return posX;
	}

	/**
	 * @param posX X轴
	 */
	public void setPosX(int posX) {
		this.posX = posX;
	}

	/**
	 * @return Y轴
	 */
	public int getPosY() {
		return posY;
	}

	/**
	 * @param posY Y轴
	 */
	public void setPosY(int posY) {
		this.posY = posY;
	}

	/**
	 * @return 页码
	 */
	public BiPredicate<Integer, Integer> getPage() {
		return page;
	}

	/**
	 * @param page 页码
	 */
	public void setPage(BiPredicate<Integer, Integer> page) {
		this.page = page;
	}

}
